iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Cloud Native

K8s上的機器人沙盒系列 第 5

# Day 5|儲存入門:NFS + PersistentVolumeClaim

  • 分享至 

  • xImage
  •  

承接 Day 4(GPU Operator 就緒)。 將NFSKubernetes 接起來,提供 Isaac Sim/Isaac Lab datasetsassets 儲存空間。

需求與命名

  • NFS 伺服器節點:nfs1

  • 匯出目錄:/srv/nfs/isaac

    • assets/:3D 場景、USD、URDF、貼圖、模型等
    • datasets/:錄製資料、訓練資料、實驗輸出
    • cache/:臨時快取(可清)
  • K8s 命名空間:robotics

後續把 Selkies/Isaac 的 Deployment 掛載到 assets/datasets/,並控制訪問權限與容量上限。

A. 建立 NFS 伺服器

1) 安裝與目錄

Ubuntu

sudo apt-get update
sudo apt-get install -y nfs-kernel-server
sudo mkdir -p /srv/nfs/isaac/{assets,datasets,cache}
sudo chown -R root:root /srv/nfs/isaac
sudo chmod 0775 /srv/nfs/isaac /srv/nfs/isaac/*

Rocky/Alma 9

sudo dnf install -y nfs-utils
sudo mkdir -p /srv/nfs/isaac/{assets,datasets,cache}
sudo chown -R root:root /srv/nfs/isaac
sudo chmod 0775 /srv/nfs/isaac /srv/nfs/isaac/*

2) 匯出設定 /etc/exports

/srv/nfs/isaac 192.168.27.0/24(rw,sync,no_subtree_check,root_squash)

套用:

sudo exportfs -ra

3) 防火牆與服務

NFS 主要連接埠:2049/tcp,udp;若使用 rpcbind:111/tcp,udp

Ubuntu(UFW)

sudo ufw allow 2049
sudo ufw allow 111

Rocky(firewalld)

sudo systemctl enable --now nfs-server
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload

4) 節點端

在 worker gpu01 mount:

sudo apt-get install -y nfs-common   # (Ubuntu)
# 或 sudo dnf install -y nfs-utils   # (Rocky)

sudo mount -t nfs nfs1:/srv/nfs/isaac /mnt
ls /mnt
sudo umount /mnt

預設 root_squash 能避免容器內 root 直接擁有 NFS root 權限;如需寫入權限,建議在容器使用一致的 UID/GID。

B. Kubernetes:靜態 PV / PVC

# nfs-pv-static.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-isaac-assets
spec:
  capacity:
    storage: 200Gi
  accessModes: [ReadWriteMany]
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /srv/nfs/isaac/assets
    server: nfs1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-isaac-assets
  namespace: robotics
spec:
  accessModes: [ReadWriteMany]
  resources:
    requests:
      storage: 200Gi
  volumeName: pv-isaac-assets

套用:

kubectl create ns robotics || true
kubectl apply -f nfs-pv-static.yaml

測試 Pod(RWX 驗證)

# test-nfs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nfs-rwx-check
  namespace: robotics
spec:
  restartPolicy: Never
  containers:
  - name: busy
    image: busybox:1.37
    command: ["sh","-lc","id; mkdir -p /mnt/test && echo ok > /mnt/test/hello && ls -l /mnt/test && sleep 5"]
    volumeMounts:
    - name: v
      mountPath: /mnt
  volumes:
  - name: v
    persistentVolumeClaim:
      claimName: pvc-isaac-assets

C. Kubernetes 動態 Provision

1) 安裝 Provisioner(Helm)

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update

helm upgrade --install nfs-prov \
  nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  -n storage --create-namespace \
  --set nfs.server=nfs1 \
  --set nfs.path=/srv/nfs/isaac \
  --set storageClass.name=nfs-rwx \
  --set storageClass.defaultClass=false \
  --set storageClass.accessModes={ReadWriteMany}

這會建立一個 StorageClass: nfs-rwx,往後只要宣告 PVC 指到這個 SC,就會在 /srv/nfs/isaac/ 下自動產生子目錄。

2) 動態 PVC 範例

# pvc-datasets.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-datasets
  namespace: robotics
spec:
  accessModes: [ReadWriteMany]
  storageClassName: nfs-rwx
  resources:
    requests:
      storage: 500Gi

建立後,到 nfs1:/srv/nfs/isaac/ 會看到對應子目錄(以 PVC UID 命名)。

D. 與 Isaac 容器整合

# isaac-mounts-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: isaac-sandbox-demo
  namespace: robotics
spec:
  replicas: 1
  selector:
    matchLabels: {app: isaac-sandbox-demo}
  template:
    metadata:
      labels: {app: isaac-sandbox-demo}
    spec:
      containers:
      - name: app
        image: nvcr.io/nvidia/cuda:12.4.1-runtime-ubuntu22.04
        command: ["bash","-lc","ls -al /assets; ls -al /datasets; sleep 3600"]
        volumeMounts:
        - name: assets
          mountPath: /assets
        - name: datasets
          mountPath: /datasets
      volumes:
      - name: assets
        persistentVolumeClaim:
          claimName: pvc-isaac-assets
      - name: datasets
        persistentVolumeClaim:
          claimName: pvc-datasets

E. 權限與 UID / GID

  • root_squash:NFS 伺服器預設把客體端的 root 降權;因此在容器側 盡量用固定 UID/GID,並在 NFS 端建立對應目錄與擁有者。

  • 範例(將 robotics 工作負載統一用 UID/GID 2000):

    sudo groupadd -g 2000 robotics || true
    sudo useradd -u 2000 -g 2000 -M -s /usr/sbin/nologin robotics || true
    sudo chown -R 2000:2000 /srv/nfs/isaac/{assets,datasets,cache}
    
  • 在容器中:

    • 若映像支援 --user 2000:2000 可直接指定;或在 Pod 安全性內容:
    securityContext:
      runAsUser: 2000
      runAsGroup: 2000
      fsGroup: 2000
    

感想

スゲジュウルに間に合わなさそう、土日残業を考えるだけでも辛い、ぴえん。


上一篇
Day 4|部署 NVIDIA GPU Operator(Driver/Runtime/Device Plugin/GFD)
下一篇
Day 6|系統入口:Ingress Controller(NGINX)+ cert-manager + DNS 規劃
系列文
K8s上的機器人沙盒18
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言